package com.kizuki.design.chain;

import lombok.extern.slf4j.Slf4j;

import java.util.Objects;

@Slf4j
public abstract class Verify {

    /**
     * 责任链的核心是类中包含一个自己
     *      包含一个与自己相同类型的对象
     * 责任链模式中的 校验器 封装一个 校验器 本身
     * 使用 protected 修饰的目的是让子类可以获取到该类
     */
    protected Verify nextVerify;

    public void setNextVerify(Verify verify) {
        this.nextVerify = verify;
    }

    public VerifyResult verify(UserAccount userAccount) {
        VerifyResult verifyResult = handle(userAccount);
        if (!verifyResult.isSuccess()){
            log.error("检验失败退出责任链, 原因为:{}", verifyResult.getMessage());
            return verifyResult;
        }
        if (Objects.isNull(nextVerify)) {
            return verifyResult;
        } else {
            return nextVerify.verify(userAccount);
        }
    }

    /**
     * 每个校验器的逻辑代码
     * @param userAccount
     */
    protected abstract VerifyResult handle(UserAccount userAccount);

}
